切换主题
Docker Compose
Docker Compose 是 Docker 官方提供的容器编排工具,用于定义和管理多个 Docker 容器的应用。它允许你通过一个 docker-compose.yml
文件来定义多个服务、网络、存储卷等,然后使用一条命令 (docker-compose up
) 统一管理这些容器。
🚀 Docker Compose 适用于本地开发、测试、多服务部署,解决了多容器管理、环境一致性、服务依赖等问题,让容器化应用更简单高效!
Docker Compose 的功能
- 定义多容器应用
- 通过
docker-compose.yml
文件,定义多个相互关联的服务,例如 Web 服务器、数据库、缓存等。
- 通过
- 一键启动多个容器
- 只需
docker-compose up
,就可以启动多个容器,避免手动运行多个docker run
命令。
- 只需
- 管理容器的网络
- 自动创建隔离的网络环境,确保服务之间可以相互通信,同时不影响其他容器。
- 数据持久化
- 支持数据卷(Volumes),保证数据库等数据不会因容器重启而丢失。
- 环境变量管理
- 通过
.env
文件管理环境变量,简化不同环境的配置(开发、测试、生产)。
- 通过
- 扩展与缩放
- 运行
docker-compose up --scale service_name=3
可以快速扩展服务的副本数量,实现负载均衡。
- 运行
- 日志管理
- 通过
docker-compose logs
查看所有容器的日志,便于调试。
- 通过
Docker Compose 解决了什么问题?
- 简化多容器管理
- 传统方式需要手动
docker run
多个容器,而 Compose 只需docker-compose up
即可一键启动。
- 传统方式需要手动
- 避免复杂的命令行参数
docker run
需要手动指定端口、网络、挂载卷等,而 Compose 通过yml
文件预定义配置,简洁高效。
- 保持一致的环境配置
- 开发、测试、生产环境的配置可以通过
docker-compose.yml
统一管理,避免“在我本地没问题”这种情况。
- 开发、测试、生产环境的配置可以通过
- 支持服务依赖
- 可以在
depends_on
中指定某个服务要在另一个服务启动后再运行,比如数据库要先启动,Web 服务器再启动。
- 可以在
上节介绍了使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。Compose 恰好满足了这样的需求,其是 Docker 官方编排项目之一,负责快速的部署分布式应用。 通过 Compose,可以单引擎模式定义和运行多容器 Docker 应用程序,并且可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Compose 中有两个重要的概念:
- 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目 (project):由一组关联的应用容器组成的一个完整业务单元。
可见,一个项目可以由多个服务(容器)关联而成,在 docker-compose.yml 文件中进行定义,Compose 面向项目进行管理。
Docker Compose 安装与配置
直接下载安装
shell
# 下载docker-compose
sudo curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 对下载的文件添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 创建软连接:
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 测试一下是否安装成功:
docker-compose -v
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
通过apt安装
安装docker-compose
sudo apt update && sudo apt install -y docker-compose
1
Compose 支持 Linux、macOS、Windows 10 三大平台。Compose可以通过 python 的包管理工具 pip 进行安装,也可以下载编译好的二进制文件直接使用。
二进制包安装
在 Linux 上的也安装十分简单,从 官方 GitHub Release 处直接下载编译好的二进制文件即可。
sh
# 运行以下命令以下载 Docker Compose 的相应版本版本
sudo curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 对下载的文件添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 测试安装, 能得到版本号信息说明安装成功
docker-compose --version
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
国内用户可以使用以下方式加快下载
sh
# 运行以下命令以下载 Docker Compose 的相应版本版本
sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 对下载的文件添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 测试安装, 能得到版本号信息说明安装成功
docker-compose --version
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
Compose 卸载
如果是二进制包方式安装的,删除二进制文件即可。
$ sudo rm /usr/local/bin/docker-compose
1
docker-compse中yml配置
docker-compose中的配置命令很多都是Dockerfile中的命令,不过需要遵循yml的文件格式。下面讲解yml配置是针对单服务器的容器管理,如果是集群模式配置会稍微有些不同。
version 指定本 yml 依从的 compose 哪个版本制定的。
build 指定为构建镜像上下文路径:
例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
version: "3.7"
services:
webapp:
build: ./dir
1
2
3
4
2
3
4
或者,作为具有在上下文指定的路径的对象,以及可选的参数 Dockerfile 和 args等:
version: "3.7"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
context:上下文路径。 dockerfile:指定构建镜像的 Dockerfile 文件名。 args:添加构建参数,这是只能在构建过程中访问的环境变量。 labels:设置构建镜像的标签。 image 指定容器从哪个镜像运行启动。以下格式都可以:
image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd # 镜像id container_name 自定义运行后容器名称,而不是生成的默认名称。
container_name: my-web-container volumes 将主机的数据卷或着文件挂载到容器里。
volumes: - "/localhost/postgres.sock:/var/run/postgres/postgres.sock" - "/localhost/data:/var/lib/postgresql/data" command 覆盖容器启动的默认命令。
command: ["bundle", "exec", "thin", "-p", "3000"] entrypoint 覆盖容器默认的 entrypoint。
entrypoint: /code/entrypoint.sh 也可以是以下格式:
entrypoint: - php - -d - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so - -d - memory_limit=-1 - vendor/bin/phpunit depends_on 设置依赖关系。
docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。注意:web 服务不会等待 redis、db 完全启动 之后才启动。 docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。 docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
restart no:是默认的重启策略,在任何情况下都不会重启容器。 always:容器总是重新启动。 on-failure:在容器非正常退出时(退出状态非0),才会重启容器。 unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器 restart: "no" restart: always restart: on-failure restart: unless-stopped expose 暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数:
expose:
- "3000"
- "8000" environment和env_file environment添加环境变量。可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
environment: RACK_ENV: ${development} #可以从环境中读取环境变量 SHOW: 'true' env_file: docker compose 对环境变量的使用提供了非常丰富支持和灵活的使用方式。可以从文件添加环境变量,默认从当前下的。可以是单个值或列表的多个值。
env_file: .env 也可以是列表格式:
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env 前面的的一些命令相对比较常用,下面给出一个具体的yml文件配置示例:
version: '3'
services:
my-search:
build:
context: .
container_name: my-search
image: my_search:v1
depends_on:
- elasticsearch
ports:
- 8500:8500/tcp
environment:
- MySQL_CASE_HOST=10.201.187.225
- MySQL_CASE_PORT=123456
- MySQL_CASE_USER=root
- MySQL_CASE_PASSWD=screte
- DEFAULT_CASE_DATABASE=gov_init_1
- CASE_TYPE=kingbase # 如果mysql数据TPYE改成mysql
restart: always
command: python start_service.py
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
container_name: "elasticsearch"
ports:
- 9200:9200
- 9300:9300
environment:
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
- cluster.name=hanscal-es
- bootstrap.memory_lock=true
- discovery.type=single-node
volumes:
- ./data/elasticsearch/data:/usr/share/elasticsearch/data
- ./data/elasticsearch/logs:/usr/share/elasticsearch/logs
- ./data/elasticsearch/plugins/ik:/usr/share/elasticsearch/plugins/ik
kibana:
image: docker.elastic.co/kibana/kibana:7.6.2
container_name: kibana
depends_on:
- elasticsearch
ports:
- 5601:5601
volumes:
- ./config/kibana.yml:/usr/share/kibana/config/kibana.yml
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
links:
- elasticsearch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
下面的命令使用频率稍微低一点。
networks和network_mode networks配置容器连接的网络,引用顶级 networks 下的条目 。
services:
some-service:
networks:
some-network:
aliases:
- alias1
other-network:
aliases:
- alias2
networks:
some-network:
# Use a custom driver
driver: custom-driver-1
other-network:
# Use a custom driver which takes special options
driver: custom-driver-2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
network_mode设置网络模式。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
1
2
3
4
5
2
3
4
5
healthcheck
用于检测 docker 服务是否健康运行。
healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序 interval: 1m30s # 设置检测间隔 timeout: 10s # 设置检测超时时间 retries: 3 # 设置重试次数 start_period: 40s # 启动后,多少秒开始启动检测程序 secrets 存储敏感数据,例如密码:
version: "3.1"
services:
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
secrets:
- my_secret
secrets:
my_secret:
file: ./my_secret.txt
aliases
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。
extra_hosts 添加主机名映射。类似 docker client --add-host。
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229" 以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系:
162.242.195.82 somehost 50.31.209.229 otherhost logging 服务的日志记录配置。
driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项
driver: "json-file" driver: "syslog" driver: "none" 在 json-file 驱动程序下,可以使用以下参数,限制日志得数量和大小。当达到文件限制上限,会自动删除旧得文件。
logging:
driver: json-file
options:
max-size: "200k" # 单个文件大小为200k
max-file: "10" # 最多10个文件
syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
示例:使用 Docker Compose 部署 MySQL 和 Redis
参考:https://blog.csdn.net/cacacai/article/details/104717483
安装docker/docker-compose环境搭建redis、mysql、elk服务
文件
- docker-compose.yml
- redis.conf
- my.ini
创建yml文件
vi docker-compose.yml
1
yml文件内容
version: '3'
services:
mysql:
image: mysql:5.7.24 # MySQL镜像
container_name: mysql # MySQL容器名称
environment:
MYSQL_ROOT_PASSWORD: 123456 # MySQL ROOT账号密码
ports:
- 3306:3306 # 端口映射
volumes:
- /var/mysql/data:/var/lib/mysql #挂载 MySQL数据
redis:
image: redis:4.0.14 # Redis镜像
container_name: redis # Redis容器名称
command: redis-server /usr/local/etc/redis/redis.conf --appendonly yes # 表示通过挂载配置文件追加配置
volumes:
- /var/redis/data:/data #挂载 Redis数据
- /var/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf #挂载 Redis配置
ports:
- 6379:6379 # 端口映射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
创建挂载目录
1
redis.conf
1
执行
docker-compose -f mysql-redis.yml up -d
1
docker ps -a | grep -E "mysql|redis"
1
示例:使用 Docker Compose 运行 Web 应用
1️⃣ 创建 docker-compose.yml
yaml
version: '3.8'
services:
web:
image: nginx
ports:
- "8080:80"
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: testdb
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2️⃣ 运行 Docker Compose
bash
docker-compose up -d # 后台运行
1
3️⃣ 查看运行状态
bash
docker-compose ps
1
4️⃣ 停止并删除容器
bash
docker-compose down
1